package org.tool.spring.utils.reflect;

import org.springframework.aop.framework.Advised;
import org.springframework.aop.framework.AopProxyUtils;
import org.tool.reflect.GenericUtil;

/**
 * 泛型相关工具类-扩展支持 Spring AOP 代理对象
 *
 * @author 李坤
 * @date 2022/7/10 17:04
 */
public abstract class GenericExtendUtil {

    /**
     * 获得指定对象的父类对应的泛型参数的实际类型。如 ClassA extends ClassB<String>
     *
     * @param target 给定的对象，该类必须继承范型父类
     *
     * @return 范型参数的实际类型，如果没有实现ParameterizedType接口，即不支持泛型，所以直接返回<code>Object.class</code>
     */
    public static Class getSuperClassGenericType(Object target) {
        return GenericExtendUtil.getSuperClassGenericType(target, 0);
    }

    /**
     * 获得指定对象的父类对应的泛型参数的实际类型。如 ClassA extends ClassB<String>
     *
     * @param target 给定的对象，该类必须继承范型父类
     * @param index  泛型参数所在索引，从0开始
     *
     * @return 范型参数的实际类型，如果没有实现ParameterizedType接口，即不支持泛型，所以直接返回<code>Object.class</code>
     */
    public static Class getSuperClassGenericType(Object target, final int index) {
        if (target instanceof Advised) {
            target = AopProxyUtils.getSingletonTarget(target);
        }
        return GenericUtil.getSuperClassGenericType(target.getClass(), index);
    }

}
